home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork2.lzh / サンプル基礎編 / サブウィンドウ / SUBWIN.C < prev    next >
Text File  |  1994-03-10  |  11KB  |  297 lines

  1. /******************************************************************************
  2.  *    subwin.c:    サブウィンドウの処理関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <event.h>        /* イベントマンを利用するときに必要    */
  7. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  8. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  9. #include <control.h>        /* コントロールマンを利用するときに必要    */
  10. #include <task.h>        /* タスクマンを利用するときに必要    */
  11. #include "subwin.h"        /* このプログラム固有のヘッダファイル    */
  12.  
  13. static Rect wsSize = { 0, 0, SUBWIN_H, SUBWIN_V }; /* サブウィンドウサイズ */
  14.  
  15. /******************************************************************************
  16.  *    createSubwin():    サブウィンドウの作成
  17.  ******************************************************************************
  18.  *    引数:    ComVal *pcv    共通変数へのポインタ
  19.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  20.  *                = FALSE: 作成失敗(終了)
  21.  */
  22. BOOLEAN createSubwin(ComVal *pcv)
  23. {
  24.     Rect rc;
  25.  
  26.     pcv->subRgnHdl = GMNewRgn();    /* リージョンハンドルを確保する    */
  27.     if (pcv->subRgnHdl == NULL)
  28.         return FALSE;        /* 失敗したのでFALSEを返す    */
  29.  
  30.     /* サブウィンドウの外枠(リージョン)を設定する */
  31.     rc = wsSize;
  32.     rc.d.right--;
  33.     rc.d.bottom--;
  34.     GMRectRgn(pcv->subRgnHdl, &rc);
  35.     rc.d.left += 4;
  36.     rc.d.top += 4;
  37.     rc.d.right++;
  38.     rc.d.bottom++;
  39.     GMOrRectRgn(pcv->subRgnHdl, pcv->subRgnHdl, &rc);
  40.     GMSlideRgn(pcv->subRgnHdl, TSGetWindowPos());
  41.  
  42.     return openSubwin(pcv);        /* サブウィンドウがオープンできたか? */
  43. }
  44.  
  45. /******************************************************************************
  46.  *    openSubwin():    サブウィンドウのオープン
  47.  ******************************************************************************
  48.  *    引数:    ComVal *pcv    共通変数へのポインタ
  49.  *    戻り値:    BOOLEAN        = TRUE:  オープン成功
  50.  *                = FALSE: オープン失敗
  51.  */
  52. BOOLEAN openSubwin(ComVal *pcv)
  53. {
  54.     pcv->subwinPtr = WSOpen(    /* サブウィンドウをオープンする    */
  55.         NULL,            /* サブウィンドウポインタを確保する */
  56.         pcv->subRgnHdl,        /* リージョンハンドル        */
  57.         32);            /* プライオリティ値(通常は32以上)*/
  58.     if (pcv->subwinPtr == NULL)
  59.         return FALSE;        /* 失敗したのでFALSEを返す    */
  60.  
  61.     /* サブウィンドウをカレントグラフにする */
  62.     GMSetGraph(&pcv->subwinPtr->win.graph);
  63.     GMForeColor(G_BLACK);        /* フォアグラウンドカラーを黒にする */
  64.     /* バックグラウンドカラーをライトグレーにする */
  65.     GMBackColor(G_LGRAY);
  66.     /* タスクIDの上位ワードにサブウィンドウの通し番号を入れる(0以外) */
  67.     pcv->subwinPtr->win.taskID = LONGWORD(1, TSGetID());
  68.     return TRUE;            /* 成功したのでTRUEを返す    */
  69. }
  70.  
  71. /******************************************************************************
  72.  *    closeSubwin():    サブウィンドウのクローズ
  73.  ******************************************************************************
  74.  *    引数:    ComVal *pcv    共通変数へのポインタ
  75.  */
  76. void closeSubwin(ComVal *pcv)
  77. {
  78.     WSDispose(pcv->subwinPtr);    /* サブウィンドウをクローズする    */
  79. }
  80.  
  81. /******************************************************************************
  82.  *    msLDownSubwin(): サブウィンドウのマウスレフトダウンイベント処理
  83.  ******************************************************************************
  84.  *    引数:    ComVal *pcv    共通変数へのポインタ
  85.  *    戻り値:    int        サブウィンドウのパートコード
  86.  *    注釈:
  87.  *    サブウィンドウ上でマウスの左ボタンが押された場合の処理を行う。サポート
  88.  *    される処理は、サブウィンドウの移動、クローズボタンの強調表示で、マウス
  89.  *    のボタンが押された、または離された場所のパートコードを取得します。
  90.  */
  91. int msLDownSubwin(ComVal *pcv)
  92. {
  93.     LPoint lpt;
  94.  
  95.     static Rect rcClose = {        /* サブウィンドウのクローズボタン */
  96.         CLOSE_X, CLOSE_Y, CLOSE_X + WS_CLOSE_W, CLOSE_Y + WS_CLOSE_W
  97.     };
  98.     static Rect wsInside = {    /* サブウィンドウの内側        */
  99.         WS_INSIDE_X, WS_INSIDE_Y, SUBWIN_H - 2, SUBWIN_V - 2
  100.     };
  101.  
  102.     /* サブウィンドウをカレントグラフにする */
  103.     GMSetGraph(&pcv->subwinPtr->win.graph);
  104.  
  105.     /* イベント発生時のポインタ座標をローカル座標系に変換する */
  106.     lpt = GMGlobalToLocal(pcv->event.ev.where.x_y);
  107.     if (GMPtInRect(&rcClose, lpt)) { /* クローズボタンが押されたか? */
  108.         if (checkPctBtn(pcv, &rcClose, lpt)) {
  109.             WSDelist(pcv->subwinPtr); /* サブウィンドウを消去する */
  110.             pcv->subActiveFlag = FALSE;
  111.             return WS_INCLOSE;
  112.         }
  113.     } else if (GMPtInRect(&wsInside, lpt)) { /* サブウィンドウの内側か? */
  114.         return WS_ININSIDE;
  115.  
  116.     /* サブウィンドウのドラッグリージョン(内側でない)*/
  117.     } else {
  118.         dragSubwin(pcv, lpt);    /* サブウィンドウをドラッグする    */
  119.         return WS_INDRAG;
  120.     }
  121.  
  122.     return 0;
  123. }
  124.  
  125. /******************************************************************************
  126.  *    dragSubwin():    サブウィンドウのドラッグ(移動)処理
  127.  ******************************************************************************
  128.  *    引数:    ComVal *pcv    共通変数へのポインタ
  129.  *        LPoint lpt    ポインタ座標(ローカル座標系)
  130.  */
  131. void dragSubwin(ComVal *pcv, LPoint lpt)
  132. {
  133.     Point pt, pt2, npt, dpt;
  134.     Rect rc;
  135.  
  136.     rc = wsSize;
  137.     GMInvertRect(            /* ラバーバンドを描画する    */
  138.         &rc,            /* 表示するレクタングル        */
  139.         WS_RUBBERBAND);        /* サブウィンドウのラバーバンド    */
  140.  
  141.     pt.x_y = lpt;
  142.     /* サブウィンドウの左上座標からマウスの現在位置までの距離を計算する */
  143.     pt2.p.x = pcv->event.ev.where.p.x - (*pcv->subRgnHdl)->bounds.d.left;
  144.     pt2.p.y = pcv->event.ev.where.p.y - (*pcv->subRgnHdl)->bounds.d.top;
  145.     /* マウスの左ボタンが押されたままなら、ラバーバンドを移動する */
  146.     do {
  147.         npt.x_y = EMMSLoc();    /* マウスの現在位置を取得する    */
  148.         if (npt.x_y != pt.x_y) { /* マウスが移動したか?    */
  149.             /* ラバーバンドを消去する */
  150.             GMInvertRect(&rc, WS_RUBBERBAND);
  151.             /* 移動後のレクタングルを設定する */
  152.             dpt.p.x = npt.p.x - pt.p.x;
  153.             dpt.p.y = npt.p.y - pt.p.y;
  154.             GMSlideRect(&rc, dpt.x_y);
  155.             /* ラバーバンドを描画する */
  156.             GMInvertRect(&rc, WS_RUBBERBAND);
  157.         }
  158.         pt = npt;
  159.     } while (EMLStill());        /* 左ボタンが離されたら終わり */
  160.     GMInvertRect(&rc, WS_RUBBERBAND); /* ラバーバンドを消去する    */
  161.  
  162.     /* 左ボタンが離された位置がドラッグ開始位置と同じか? */
  163.     if (pt.x_y == lpt)
  164.         return;            /* 同じ場合はこのまま        */
  165.  
  166.     /* 移動後のサブウィンドウの外枠(リージョン)を設定する */
  167.     pt.p.x -= pt2.p.x;
  168.     pt.p.y -= pt2.p.y;
  169.     GMSlideRgn(pcv->subRgnHdl, pt.x_y);
  170.  
  171.     /* サブウィンドウの移動は、サブウィンドウを一度クローズして
  172.        新しいリージョンで再度オープンする */
  173.     closeSubwin(pcv);        /* サブウィンドウをクローズする    */
  174.     if (!openSubwin(pcv)) {        /* サブウィンドウをオープンする    */
  175.         /* サブウィンドウがオープンできなかったので、ドラッグは失敗 */
  176.         pcv->subActiveFlag = FALSE;
  177.         pcv->errorCode = 5;
  178.         pcv->endFlag = TRUE;    /* 終了フラグをセットする    */
  179.     }
  180. }
  181.  
  182. /******************************************************************************
  183.  *    drawSubwin():    サブウィンドウの描画
  184.  ******************************************************************************
  185.  *    引数:    ComVal *pcv    共通変数へのポインタ
  186.  */
  187. void drawSubwin(ComVal *pcv)
  188. {
  189.     int lastAP, lastPM;
  190.     Rect rc;
  191.  
  192.     /* サブウィンドウをカレントグラフにする */
  193.     GMSetGraph(&pcv->subwinPtr->win.graph);
  194.  
  195.     rc = wsSize;
  196.     /* サブウィンドウを描画する場合は、まず全体(全ページ)をクリアする */
  197.     lastAP = GMAPage(G_ALLPAGE);    /* アクセスページを全ページにする */
  198.     /* ペンモードをバックグラウンドカラーにする */
  199.     lastPM = GMPenMode(G_BACK << 8 | G_PSET);
  200.     GMFillRect(&rc);        /* サブウィンドウ内をクリアする    */
  201.     GMPenMode(lastPM);        /* ペンモードを元に戻す        */
  202.     GMAPage(lastAP);        /* アクセスページを元に戻す    */
  203.  
  204.     GMFrameRect(&rc);        /* サブウィンドウの外枠を描画する */
  205.     rc.d.right--;
  206.     rc.d.bottom--;
  207.     GMFrameRect(&rc);
  208.  
  209.     drawSubTitleBar(pcv);        /* タイトルバーを描画する    */
  210. }
  211.  
  212. /******************************************************************************
  213.  *    drawSubTitleBar():    サブウィンドウのタイトルバーの描画
  214.  ******************************************************************************
  215.  *    引数:    ComVal *pcv    共通変数へのポインタ
  216.  */
  217. void drawSubTitleBar(ComVal *pcv)
  218. {
  219.     int i;
  220.  
  221.     /* サブウィンドウのタイトルバーの描画情報 */
  222.     static struct {
  223.         int color;
  224.         Rect rc;
  225.     } wsTitle[7] = {
  226.         { G_DGRAY, {        1,  1, SUBWIN_H - 2, 17 }},
  227.         { G_WHITE, {        1,  1,          3, 16 }},
  228.         { G_WHITE, {        3,  1, SUBWIN_H - 2,  3 }},
  229.         { G_DGRAY, {        2, 15, SUBWIN_H - 2, 18 }},
  230.         { G_BLACK, { SUBWIN_H - 3,  2, SUBWIN_H - 1, 17 }},
  231.         { G_BLACK, {        1, 16, SUBWIN_H - 3, 17 }},
  232.         { G_BLACK, {        3, 15, SUBWIN_H - 3, 16 }}
  233.     };
  234.     /* サブウィンドウ用クローズボタンのレクタングルイメージ */
  235.     static unsigned short wsClose[4 + 10 * 2] = {
  236.         0, 0, WS_CLOSE_W, WS_CLOSE_W, /* バウンドレクタングル    */
  237.         /* ビットイメージ(1ページ目)*/
  238.         0x0040, 0x7fc0, 0x7fc0, 0x7ec0, 0x7dc0, 0x7fc0, 0x77c0, 0x6fc0,
  239.         0x7fc0, 0xffc0,
  240.         /* ビットイメージ(2ページ目)*/
  241.              0, 0x0040, 0x2140, 0x1240, 0x0c40, 0x0c40, 0x1240, 0x2140,
  242.         0x0040, 0x7fc0
  243.     };
  244.  
  245.     /* サブウィンドウのタイトルバーを描画する */
  246.     for (i = 0; i < 7; i++) {
  247.         GMForeColor(wsTitle[i].color);
  248.         GMFillRect(&wsTitle[i].rc);
  249.     }
  250.     GMForeColor(G_BLACK);        /* フォアグラウンドカラーを元に戻す */
  251.  
  252.     /* クローズボタンを描画する */
  253.     GMPutRImg((RectImg *) wsClose, LONGWORD(CLOSE_X, CLOSE_Y));
  254. }
  255.  
  256. /******************************************************************************
  257.  *    checkPctBtn():    ピクチャーボタンのチェック
  258.  ******************************************************************************
  259.  *    引数:    ComVal *pcv    共通変数へのポインタ
  260.  *        Rect *prc    ピクチャーボタンのレクタングルへのポインタ
  261.  *        LPoint lpt    ポインタ座標(ローカル座標系)
  262.  *    戻り値:    BOOLEAN overFlag = TRUE:  ピクチャーボタンの上で離された
  263.  *                 = FALSE: ピクチャーボタンの外で離された
  264.  */
  265. BOOLEAN checkPctBtn(ComVal *pcv, Rect *prc, LPoint lpt)
  266. {
  267.     BOOLEAN now, overFlag = TRUE;
  268.  
  269.     revFillRect(prc);        /* ピクチャーボタンを反転する    */
  270.     /* マウスの左ボタンが離されるまでループする */
  271.     do {
  272.         now = GMPtInRect(prc, EMMSLoc());
  273.         if (now != overFlag) {
  274.             /* マウスの位置がピクチャーボタン上から変化したら、
  275.                ピクチャーボタンを反転する */
  276.             revFillRect(prc);
  277.             overFlag = now;
  278.         }
  279.     } while (EMLStill());        /* 左ボタンが離されたら終わり    */
  280.  
  281.     return overFlag;
  282. }
  283.  
  284. /******************************************************************************
  285.  *    revFillRect():    レクタングルの全面反転
  286.  ******************************************************************************
  287.  *    引数:    Rect *prc    反転するレクタングルへのポインタ
  288.  */
  289. void revFillRect(Rect *prc)
  290. {
  291.     int lastPM;
  292.  
  293.     lastPM = GMPenMode(G_XOR);    /* ペンモードをXORに設定する    */
  294.     GMFillRect(prc);
  295.     GMPenMode(lastPM);        /* ペンモードを元に戻す        */
  296. }
  297.